#ifndef MESSAGESHOWAREA_H
#define MESSAGESHOWAREA_H

#include <QWidget>
#include <QScrollArea>
#include "model/data.h"
#include <QLabel>
#include "debug.h"
#include "userinfowidget.h"
#include "./model/datacenter.h"
#include <QMouseEvent>


using model::MessageInfo;
/**********************************************************************************************
 * 右边消息展示区域
 **********************************************************************************************/
class MessageShowArea : public QScrollArea
{
    Q_OBJECT
public:
    explicit MessageShowArea(QWidget *parent = nullptr);
    //头插消息
    void addFrontMessage(bool isLeft,const MessageInfo& message);
    //尾插消息
    void addBackMessage(bool isLeft,const MessageInfo& message);
    //清空消息
    void clear();

    //滚动条至末尾
    void scrollToEnd();

protected:

    QWidget* container;
signals:
};


/**********************************************************************************************
 * 一条包含头像、时间、内容的消息
 * 其中，内容可以是文本、文件、语音、图片
 **********************************************************************************************/
class MessageItem : public QWidget
{
    Q_OBJECT
public:
    MessageItem(bool isLeft);   //会将该条消息，添加到布局管理器中，所以无需传递父指针
    bool isLeft;

    static MessageItem* makeMessageItem(bool isLeft,const MessageInfo& message);

    static QWidget* makeTextContent(bool isLeft,const QString& message);
    static QWidget* makeFileContent(bool isLeft,const MessageInfo& message);
    static QWidget* makeImageContent(bool isLeft,const QString& fileId,const QByteArray& iamgeContent);
    static QWidget* makeSpeechContent(bool isLeft,const MessageInfo& message);
signals:
};



/**********************************************************************************************
 * 创建类表示 "文本消息" 正文部分
 * 也表示文件消息
 **********************************************************************************************/
class MessageContentLabel : public QWidget
{
     Q_OBJECT
public:
     MessageContentLabel(bool isLeft,const QString& text,const QString& fileId,
                        const model::MessageType messageType,const QByteArray& fileContent);

    void paintEvent(QPaintEvent* event) override;
     //实现点击文件另存为
    void mousePressEvent(QMouseEvent* event) override;
    //右键消息，弹出菜单
    void contextMenuEvent(QContextMenuEvent* event) override;
    void speechConvertTextDone(const QString& fileId,const QString& speechContent);

    void updateUI(const QString& fileId,const QByteArray& fileContent);
    void playDone();

    void saveFile(const QByteArray& fileContent);


private:
    bool isLeft;
    QLabel* textLabel;

    //以下特意针对文件消息
    QString fileId;         //文件ID
    QByteArray fileContent; //文件内容
    model::MessageType messageType; //文件类型
    bool loadContentDone = false;   //文件是否加载完毕
};

/**********************************************************************************************
 * 创建类表示 "图片消息" 正文部分
 **********************************************************************************************/
class MessageImageLabel : public QWidget
{
     Q_OBJECT
public:
     MessageImageLabel(bool isLeft,const QString& fileId,const QByteArray& imageContent);

     void updataUI(const QString& fileId,const QByteArray& fileContent);
     void paintEvent(QPaintEvent* event) override;
private:
    QPushButton* imageBtn;  //存放图片
    QString fileId;         //该图片在服务器上存储的Id
    QByteArray imageContent;//图片内容
    bool isLeft;
};



#endif // MESSAGESHOWAREA_H

